#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int main()
//{
//	int a[3][4] = { 0 };
//
//	printf("%d\n", sizeof(a));//3*4*4 = 48
//	printf("%d\n", sizeof(a[0][0]));//4
//
//	printf("%d\n", sizeof(a[0]));//a[0]是第一行这个一维数组的数组名
//	//数组名算是单独放在sizeof内部了，计算的是整个数组的大小，大小是16个字节
//
//	printf("%d\n", sizeof(a[0] + 1));//?
//	//a[0]作为第一行的数组名，没有单独放在sizeo内部，没有&
//	//a[0]表示数组首元素的地址，也就是a[0][0]的地址
//	//所以a[0]+1是第一行第二个元素的地址，是地址就是4/8个字节
//	//
//	printf("%d\n", sizeof(*(a[0] + 1)));//4
//	//计算的是就是第一行第2个元素的大小
//
//	printf("%d\n", sizeof(a + 1));//4 / 8
//	//a是数组首元素的地址，是第一行的地址 int(*)[4]
//	//a+1 就是第二行的地址
//
//	printf("%d\n", sizeof(*(a + 1)));//16
//	//*(a+1) --> a[1] -> sizeof(*(a+1))->sizeof(a[1]) 计算的是第二行的大小
//	//a+1 --> 是第二行的地址，int(*)[4]
//	//*(a+1) 访问的第二行的数组
//
//	printf("%d\n", sizeof(&a[0] + 1));//4/8
//	//&a[0]是第一行的地址 int(*)[4]
//	//&a[0]+1 是第二行的地址 int(*)[4]
//
//	printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小
//
//	printf("%d\n", sizeof(*a));//计算的是第一行的大小-16
//	//a是数组首元素的地址，就是第一行的地址
//	//*a 就是第一行
//	//*a --> *(a+0) --> a[0]
//
//	printf("%d\n", sizeof(a[3]));//16
//	//a[3]--> int [4]
//	//
//	return 0;
//}
//
//
//编译    +  链接 --> 可执行程序--> 运行---> 结果
//sizeof                        s = a + 2
//
//表达式都有2个属性：
//1. 值属性   9
//2. 类型属性
//s = a + 2 --> short
//int main() 
//{
//	int a = 7;
//	short s = 4; 
//	printf("%d\n", sizeof(s = a + 2));//short 2
//
//	printf("%d\n", s);//
//	return 0;
//}
//int main()
//{
//	int a[3][2] = { (0,1),(2,3),(4,5) };
//	int*p ;
//	p = a[0];
//	printf("%d", *(p+1));
//
//
//
//
//	return 0;
//}
//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p;
////假设p 的值为0x100000。 如下表表达式的值分别为多少？
////已知，结构体Test类型的变量大小是20个字节
//int main()
//{
//	printf("%p\n", p + 0x1);
//	printf("%p\n", (unsigned long)p + 0x1);
//	printf("%p\n", (unsigned int*)p + 0x1);
//	return 0;
//}
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
//	int* p;
//	p = a[0];
//	printf("%d", p[0]);
//	return 0;
//}
//int main()
//{
//	int a[5][5];
//	int(*p)[4];
//	p = a;
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//	return 0;
//}
#include <stdio.h>
//int main()
//{
//	char* a[] = { "work","at","alibaba" };
//	char** pa = a;
//	pa++;
//	printf("%s\n", *pa);
//	return 0;
//}
//int main()
//{
//	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	/*int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));*/
//	printf("%p\n", aa[0]);
//	printf("%p\n", aa[0]+1);
//	printf("%p\n", aa);
//	printf("%p\n", aa+1);
//
//	return 0;
//}